const express = require('express')
const boom = require('boom')
const userRouter = require('./user')
const bookRouter = require('./book')
const fs = require('fs');
// 如果使用Result自定义的 res.json就不需要在这里引入constant
// const {
//     CODE_ERROR
// } = require('../utils/constant')
// 引入后台验证前端传入的toekn
const jwtAuth = require('./jwt')
// 引入自定义的res.json返回
const Result = require('../models/Result')

// 注册路由
const index = express.Router()
// 使用后台验证前端传入的toekn
index.use(jwtAuth)



index.get('/', function(req, res) {
    res.send('欢迎学习小慕读书管理后台1')
})

// 通过 userRouter 来处理 /user 路由，对路由处理进行解耦
index.use('/user', userRouter)
index.use('/book', bookRouter)

/**
 * 集中处理404请求的中间件
 * 注意：该中间件必须放在正常处理流程之后
 * 否则，会拦截正常请求
 */
index.use((req, res, next) => {
    next(boom.notFound('接口不存在'))
})

/**
 * 自定义路由异常处理中间件
 * 注意两点：
 * 第一，方法的参数不能减少
 * 第二，方法的必须放在路由最后
 */
index.use((err, req, res, next) => {
    // console.log(err)
    if(err.name == 'UnauthorizedError'){
        const { status = 401, message } = err
        new Result(null, 'Token验证失败', {
            error:status,
            errMsg:message
        }).jwtError(res.status(status))  // 这里是传进去res，同时设置res的状态401
    }else{
        const msg = (err && err.message) || '系统错误'
        const statusCode = (err.output && err.output.statusCode) || 500;
        const errorMsg = (err.output && err.output.payload && err.output.payload.error) || err.message
        // 这是不用封装的Result
        // res.status(statusCode).json({
        //     code: CODE_ERROR,
        //     msg,
        //     error: statusCode,
        //     errorMsg
        // })

        //这是用封装的Result
        new Result(null, msg, {
            error: statusCode,
            errorMsg
        }).fail(res.status(statusCode))
    }

})

module.exports = index